Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
判斷數值是否為迴文(palindrome),迴文(palindrome)的定義是:一段文字不論由左至右或是由右至左讀取,內容都是一樣的。
不能將數值轉字串。
Input: 121
Output: true
Input: -121
Output: false
Input: 10
Output: false
這題其實很簡單,但題目有限制不能轉字串,所以跟字串有關的操作都不行,很明顯,就是要用數值的運算來解題。
以12321為例,一開始要比較的是第一位(1)與最後一位(1)是否相等,思考的點在於我們要如何取得第一位與最後一位?
想到了嗎?就是使用/取商數,%取餘數,就可以取得我們要的數值了。
OK,找到關鍵點後,開始來設計流程,x為參數。
首先,有負號的一定不行,先過濾掉:
if (x < 0) {
  return false;
}
假設x=12321。
取得x第一位(1)就要除以10000取商數,如果是1234321,就要除以1000000,問題在於,要如何得知被除數是多少呢?
只要商數大於等於10,就表示除數比被除數還要多位數,被除數要乘以10再比較,直到商數小於10為止。
先宣告一個代表被除數的變數div,再用迴圈去判斷它需要幾位數:
let div = 1;
while (x / div >= 10) {
  div *= 10;
}
所以,div就會是10000。
那最後一位呢?就簡單許多,只要取除以10的餘數就好。
比較完後,假設都相同,就進行下一輪的比較,因為剛剛比較過的那些數字都不需要了,x從12321變成232。
要如何變成232?先去尾,除以10,再用Math.floor()回傳整數,變1232。
去頭呢?再除以1000取餘數。
得到232後,再繼續剛剛的方式判斷,這時的div為100。
由以上的步驟可以找出重複的規律,迴圈就派上用場了。
重新整理上述的步驟:
只要x除以div的商等於x%10的餘數,就繼續判斷,不然則回傳false。
while () {
  if (Math.floor(x / div) === x % 10) {
    continue;
  } else {
    return false;
  }
}
繼續判斷後,x就要去頭去尾,div也要除以100:
while () {
  if (Math.floor(x / div) === x % 10) {
    div /= 10;
    x = Math.floor(x / 10) % div;
    div /= 10;
    continue;
  } else {
    return false;
  }
}
最後while迴圈的判斷式要如何終止?
從div下手,只要前後位的值相同,div為了下一次的判斷,會再除以100,所以到最後它一定會小於1,此時x已經剩1位數,也就表示無須再判斷了。
當完整跑完迴圈,就表示x是palindrome。
var isPalindrome = function(x) {
  if (x < 0) {
  return false;
}
let div = 1;
while (x / div >= 10) {
  div *= 10;
}
while (div > 1) {
  if (Math.floor(x / div) === x % 10) {
    div /= 10;
    x = Math.floor(x / 10) % div;
    div /= 10;
    continue;
  } else {
    return false;
  }
}
return true;
};